Recover 在 GO 裡就是一個錯誤修補機制
可以在我們遇到 error 的時候進行該執行的動作
如果沒有 Recover , panic 函式就會在 panic 結束後函式產生執行期(run-time)的錯誤
package main
import (
"fmt"
)
func main() {
defer func() {
err := recover()
if err != nil {
fmt.Println(err) //回傳panic內的提示訊息
}
}()
fmt.Println(123)
panic("Panic!")
fmt.Println(456)
}
注意recover只在defer的函數中有效,如果不是在refer上下文中調用,recover會直接返回nil。
上述例子 defer 裡的函式 最後會回傳的是 panic 的提示訊息
通常也可以自行打印提示文字
接下來我們來判讀一段程式
package main
import (
"fmt"
"os"
"time"
)
func main() {
defer fmt.Println("defer main") // will this be called when panic?
var user = os.Getgid()
fmt.Println(user)
go func() {
defer func() {
fmt.Println("defer caller")
if err := recover(); err != nil {
fmt.Println("recover success.")
}
}()
func() {
defer func() {
fmt.Println("defer here")
}()
if user == -1 {
panic("should set user env.")
}
fmt.Println("after panic")
}()
}()
time.Sleep(1 * time.Second)
fmt.Println("final?")
}
https://ieevee.com/tech/2017/11/23/go-panic.html
geteuid():返回有效用戶的ID,windows 上是 -1
time.Sleep(1 time.Second):time.sleep是讓程式延遲若干時間後再執行下去
這裡括號內就是( 1 * 秒 )
我們先從 defer 的角度一一看我們的 函式是怎麼疊上去的,才可以知道程式的運行順序
堆疊觀念:表示資料存取的順序為先進後出(First In Last Out,FILO)如圖中的物品A;或稱為後進先出(Last In First Out,LIFO),如圖中的物品E。
Defer 遵守著 LIFO 的觀念
有 defer 的就往下堆疊 最後出來
接著從上到下 一一取出列印
defer main 作為最先 defer 的對象 自然堆疊在最下方 ,最後出來
今天的特別複雜,想用點薩爾達結束這回合